package com.fx.zmlzml.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * 系统用户实体类（MyBatis-Plus风格）
 * 对应数据库表：sys_user
 * 使用@TableId替代@KeySql，符合MyBatis-Plus规范
 * @author zml
 * @since 2025-11-03
 */
@Data // Lombok注解，自动生成getter/setter/toString等方法
@TableName("sys_user") // 指定表名，显式映射
public class SysUser {

    /**
     * 用户ID，主键
     * 对应数据库字段：id BIGINT AUTO_INCREMENT
     * 作用：唯一标识用户，自增主键
     * 注解说明：@TableId(type = IdType.AUTO) 指定MySQL自增策略
     * 优势：MyBatis-Plus标准注解，兼容性更好，功能更丰富
     */
    @TableId(type = IdType.AUTO) // MyBatis-Plus主键注解，AUTO表示数据库自增
    private Long id;

    /**
     * 用户名，唯一
     * 对应数据库字段：username VARCHAR(50) NOT NULL
     * 作用：用户登录账号，系统内唯一
     */
    private String username;

    /**
     * 密码，BCrypt加密存储
     * 对应数据库字段：password VARCHAR(100) NOT NULL
     * 作用：存储加密后的用户密码
     */
    private String password;

    /**
     * 邮箱地址
     * 对应数据库字段：email VARCHAR(100) DEFAULT NULL
     * 作用：用户邮箱，用于找回密码、通知等
     */
    private String email;

    /**
     * 手机号码
     * 对应数据库字段：phone VARCHAR(20) DEFAULT NULL
     * 作用：用户手机号，用于短信验证、通知等
     */
    private String phone;

    /**
     * 用户昵称，必填
     * 对应数据库字段：nickname VARCHAR(50) NOT NULL
     * 作用：用户显示名称，比用户名更友好
     */
    private String nickname;

    /**
     * 头像二进制数据
     * 对应数据库字段：avatar MEDIUMBLOB DEFAULT NULL
     * 作用：直接存储头像图片的二进制内容
     */
    private byte[] avatar;

    /**
     * 关联的城市级联表ID（逻辑关联）
     * 对应数据库字段：address_id BIGINT DEFAULT NULL
     * 作用：关联sys_address_cascade表，存储地址ID
     */
    private Long addressId;

    /**
     * 详细地址
     * 对应数据库字段：address_detail VARCHAR(255) DEFAULT NULL
     * 作用：存储门牌号、楼栋号等详细地址信息
     */
    private String addressDetail;

    /**
     * 注册IP地址
     * 对应数据库字段：register_ip VARCHAR(50) DEFAULT NULL
     * 作用：记录用户注册时的IP地址
     */
    private String registerIp;

    /**
     * 最后登录IP
     * 对应数据库字段：last_login_ip VARCHAR(50) DEFAULT NULL
     * 作用：记录用户最后一次成功登录的IP地址
     */
    private String lastLoginIp;

    /**
     * 最后登录时间
     * 对应数据库字段：last_login_time DATETIME DEFAULT NULL
     * 作用：记录用户最后一次成功登录的时间
     */
    private LocalDateTime lastLoginTime;

    /**
     * 登录次数，统计用
     * 对应数据库字段：login_count INT DEFAULT '0'
     * 作用：统计用户成功登录的总次数
     */
    private Integer loginCount;

    /**
     * 连续登录失败次数，用于账户锁定
     * 对应数据库字段：failed_login_count INT DEFAULT '0'
     * 作用：记录连续登录失败的次数
     */
    private Integer failedLoginCount;

    /**
     * 账户锁定时间
     * 对应数据库字段：lock_time DATETIME DEFAULT NULL
     * 作用：记录账户被锁定的时间
     */
    private LocalDateTime lockTime;

    /**
     * 是否账户未过期：
     * 对应数据库字段：account_non_expired TINYINT NOT NULL DEFAULT '1'
     * 作用：控制用户账户是否过期
     */
    private Boolean accountNonExpired;

    /**
     * 是否密码未过期：
     * 对应数据库字段：credentials_non_expired TINYINT NOT NULL DEFAULT '1'
     * 作用：控制用户密码是否过期
     */
    private Boolean credentialsNonExpired;

    /**
     * 是否启用：
     * 对应数据库字段：enabled TINYINT NOT NULL DEFAULT '1'
     * 作用：控制用户账户是否启用
     */
    private Boolean isEnabled;

    /**
     * 是否锁定：0-否, 1-是
     * 对应数据库字段：is_locked TINYINT(1) DEFAULT '0'
     * 作用：控制用户账户是否被锁定
     */
    private Boolean isLocked;

    /**
     * 是否删除：0-否, 1-是
     * 对应数据库字段：is_deleted TINYINT(1) DEFAULT '0'
     * 作用：软删除标志，1表示已删除
     * 注意：MyBatis-Plus有专门的@TableLogic注解处理软删除
     * 这里先保持简单，后续步骤会添加软删除支持
     */
    private Boolean isDeleted;

    /**
     * 创建人
     * 对应数据库字段：creator VARCHAR(50) DEFAULT NULL
     * 作用：记录数据创建人
     */
    private String creator;

    /**
     * 创建时间
     * 对应数据库字段：created_time DATETIME DEFAULT CURRENT_TIMESTAMP
     * 作用：记录数据创建时间
     */
    private LocalDateTime createdTime;

    /**
     * 更新人
     * 对应数据库字段：updater VARCHAR(50) DEFAULT NULL
     * 作用：记录数据最后更新人
     */
    private String updater;

    /**
     * 更新时间
     * 对应数据库字段：updated_time DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP
     * 作用：记录数据最后更新时间
     */
    private LocalDateTime updatedTime;
}